package line

import "strconv"

type Line struct {
	elem [5]*Node
	len  int
}

func Create() *Line {
	return &Line{}
}

func (l *Line) Len() int {
	return l.len
}

func (l *Line) Append(n *Node) {
	if l.len > 10 {
		panic("超出最大容量")
	}
	l.elem[l.len] = n
	l.len++
}

func (l *Line) Add(i int, n *Node) {
	if i < 1 || i > l.len+1 {
		return
	}
	for j := l.len - 1; j >= i-1; j-- {
		l.elem[j+1] = l.elem[j]
	}
	l.elem[i-1] = n
	l.len++
}

func (l *Line) Remove(i int) {
	if i <= 0 || i > l.len {
		return
	}
	for j := i; j <= l.len-1; j++ {
		l.elem[j-1] = l.elem[j]
	}
	l.len--
}

func (l *Line) Get(i int) *Node {
	if i < 1 || i > l.len {
		panic("取不到" + strconv.Itoa(i))
	}
	return l.elem[i-1]
}

func (l *Line) Clear() {
	for i := l.len; i > 0; i-- {
		l.Remove(i)
	}
	l.len = 0
}

func (l *Line) IsEmpty() bool {
	return l.len == 0
}

func (l *Line) Proir(n *Node) *Node {
	index := l.Locate(n)
	if index == 0 {
		return nil
	}
	return l.Get(index - 1)
}

func (l *Line) Next(n *Node) *Node {
	index := l.Locate(n)
	if index == l.len {
		return nil
	}
	return l.Get(index + 1)
}

func (l *Line) Locate(n *Node) int {
	var ret int
	for i := 0; i < l.len; i++ {
		if l.elem[i] == n {
			ret = i
		}
	}
	return ret + 1
}
